import 'dart:math';

import 'package:flutter/material.dart';
import 'package:simple_animations/simple_animations.dart';
import 'package:supercharged/supercharged.dart';

enum ParticleOffsetProps { x, y }

class ParticleModel {
  late MovieTween tween;
  late double size;
  late Duration duration;
  late Duration startTime;
  Random random;

  ParticleModel(this.random) {
    restart();
    shuffle();
  }

  restart() {
    final startPosition = Offset(-0.2 + 1.4 * random.nextDouble(), 1.2);
    final endPosition = Offset(-0.2 + 1.4 * random.nextDouble(), -0.2);

    tween = MovieTween()
    ..tween(ParticleOffsetProps.x,
     Tween(begin: startPosition.dx, end: endPosition.dx),
     duration: 2.seconds)
    ..tween(ParticleOffsetProps.y,
     Tween(begin: startPosition.dy, end: endPosition.dy),
    duration: 2.seconds);

    duration = 3000.milliseconds + random.nextInt(6000).milliseconds;
    startTime = DateTime.now().duration();
    size = 0.2 + random.nextDouble() * 0.4;
  }

  shuffle() {
    // round 函数是 Dart 数字类型的一个方法，用于将一个浮点数四舍五入到最接近的整数
    startTime -= (random.nextDouble() * duration.inMilliseconds)
    .round()
    .milliseconds;
  }

  checkIfParticleNeedsToBeRestarted() {
    if(progress() == 1.0) {
      restart();
    }
  }

  double progress() {
    // 在 Flutter 中，clamp 函数是 Dart 的一个方法，通常用于限制一个值在指定的范围内。
    // 它可以用于 num 类型（如 int 和 double），并返回一个在指定最小值和最大值之间的值
    // 功能
    // 如果值小于 lowerLimit，则返回 lowerLimit
    // 如果值大于 upperLimit，则返回 upperLimit
    // 如果值在范围内，则返回该值本身
    return ((DateTime.now().duration() - startTime) / duration)
    .clamp(0.0, 1.0)
    .toDouble();
  }
}